//
//  Status.swift
//  nimabi
//
//  Created by danny on 15/7/4.
//  Copyright © 2015年 DannyLiu. All rights reserved.
//

import UIKit
import SDWebImage

 /// 访问微博的url
private let WB_Home_Timeline_URL = "2/statuses/home_timeline.json"


class Status: NSObject {
    
    
    
    // MARK: - 数据模型属性
    /// 微博创建时间
    var created_at: String?
    /// 微博ID
    var id: Int = 0
    /// 微博信息内容
    var text: String?
    /// 微博来源
    var source: String?
    /// 配图数组
    var pic_urls: [[String: String]]? {
        
        didSet {
            // 先实例化缩略图数组
            imageURLs = [NSURL]()
            
            // 生成并添加url
            for dict in pic_urls! {
                
                let urlString = dict["thumbnail_pic"]!
                imageURLs?.append(NSURL(string: urlString)!)
            }
        }
        
        
    }
    /// 缩略图的url数组
    var imageURLs:[NSURL]?
    
    /// 用户模型
    var user: User?
    
    /// 类属性数组
    static let properties = ["created_at", "id", "text", "source", "pic_urls", "user"]
    
    
    /// 字典转模型
    init(dict: [String: AnyObject]) {
        // 这里必须要调用下父类的方法 进行初始化才能进行后续的赋值
        super.init()
        
        for key in Status.properties {
            
            // 判断键对应的属性如果不存在,或者是user的值,就跳过 其他的利用kvc进行赋值
            if dict[key] == nil || key == "user" {
                continue
            }
            setValue(dict[key], forKey: key)
        }
        
        // 判断字典中是否包含key"user"
        if let userDict = dict["user"] as? [String: AnyObject] {
            
            user = User(dict: userDict)
        }
        
        
    }
    override var description: String {
        let dict = dictionaryWithValuesForKeys(Status.properties)
        
        return ("\(dict)")
    }
    
    
    ///  加载数据
    class func loadStatus(finished: (statuses: [Status]?, error: NSError?) -> ()) {
    
        assert(sharedUserAccount != nil , "必须登录之后才能访问网络")
        
        let params = ["access_token": sharedUserAccount!.access_token]
        
        // 发起网络请求,异步加载数据
        NetWorkingTools.sharedNetWorkingTools().GET(WB_Home_Timeline_URL, parameters: params, success: { (_, JSON) -> Void in
            
            // 如果成功获取到返回的数据
            if let array = JSON["statuses"] as? [[String: AnyObject]] {
                
                // 获取微博数组
                let list = statuses(array)
                
                // 缓存下载的网络缩略图     // 将网络数据数组传入回调闭包
                cacheWebImage(list, finished: finished)

                return
            }
            
            // 回调空数据,表明数据解析出错或者其他的问题
            finished(statuses: nil, error: nil)
            
        }) { (_, error) -> Void in
            // 在开发中,这个print一定要保留,以便测试中随时可以看到出的错误
            print(error)
            finished(statuses: nil, error: error)
        }
        
    }
    
    /// 缓存下载的缩略图
    /// 缓存完所有图像之后，再通知调用方更新界面！
    /**
    要解决的问题：所有图片`被缓存完成`后，统一回调
    知识点：dispatch_group_enter
    */
    private class func cacheWebImage (list: [Status], finished: (statuses: [Status]?, error: NSError?) -> ()) {
        
        // 1. 定义调度组
        let group = dispatch_group_create()
        // 2. 遍历数组
        for s in list {
            
            // 先判断url数组是不是空的
            if s.imageURLs == nil || s.imageURLs!.isEmpty {

                continue
            }
            
//            print(s.imageURLs)
            // 异步缓存缩略图
            // 3. 遍历url数组中的url,进行图片缓存
            for url in s.imageURLs! {
                
                // 3.1 ==> 先进入组,从这里开始 所有的异步加载都会被监听到
                dispatch_group_enter(group)
                // 异步下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) in
                    
                    // 先啥都不做,反正执行到这里 就表明图片已经加载完毕
                    // 3.2 ==> 离开组
                    dispatch_group_leave(group)
                })
            }
        }
        
        // 监听调度组中的所有照片是否都已经加载完毕
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            
            finished(statuses: list, error:nil)
        }
    }
    
    
    /// 使用传入的数组,完成网络数据模型转成 Status 数组
    private class func statuses(array: [[String: AnyObject]]) -> [Status] {
        
        // 定义可变数组
        var arrayM = [Status]()
        
        // 遍历传入数组中的字典
        for dict in array {
            
            arrayM.append(Status(dict: dict))
        }
        
        return arrayM
    }

}
